Go并发读写文件、分片写、分片下载文件(实用版) |
您所在的位置:网站首页 › golang 文件上传 › Go并发读写文件、分片写、分片下载文件(实用版) |
倾心分享,如有帮助,欢迎留下足迹~ 目录 简单读取 读取&分片写 读取文件流+分片写-1 读取文件流+分片写-2 读取文件流+并发分片写 更好用的方法 http并发、分片下载 简单读取 func ReadFile(filePath string) (chunks []byte, err error) { f, err := os.Open(filePath) if err != nil { return } defer f.Close() reader := bufio.NewReader(f) for { dataByte := make([]byte, 5*1024) var n int n, err = reader.Read(dataByte) if err != nil || 0 == n { break } chunks = append(chunks, dataByte[:n]...) fmt.Printf("file: %s, len(chunks):%v", filePath, len(chunks)) } isEOF := strings.Compare(err.Error(), "EOF") if isEOF == 0 { err = nil fmt.Printf("read %s success: \n, len=%v", filePath, len(chunks)) return } fmt.Printf("readFile over") return }一般情况下已经可以满足,但如文件较大,chunks会变得很大。 读取&分片写 读取文件流+分片写-1 var bufLen = 2 * 1024 * 1024 func DownLoadFileShardByFilePath1(writerFilePath string, body io.Reader) (err error) { f, err := os.OpenFile(writerFilePath, os.O_CREATE|os.O_APPEND|os.O_WRONLY, os.ModeAppend) defer f.Close() if err != nil { fmt.Println("open err:" + err.Error()) return } writer := bufio.NewWriter(f) bs := make([]byte, bufLen) for { var read int read, err = body.Read(bs) if err != nil || 0 == read { break } _, err = writer.Write(bs[:read]) if err != nil { fmt.Println("write err:" + err.Error()) break } } if err == io.EOF { err = nil } if err != nil { return } if err = writer.Flush(); err != nil { fmt.Println("writer flush err: ", err.Error()) return } fmt.Printf("downLoad over") return } 读取文件流+分片写-2 var bufLen = 2 * 1024 * 1024 func DownLoadFileShard(writerFilePath string, body io.Reader) (err error) { f, err := os.OpenFile(writerFilePath, os.O_CREATE|os.O_APPEND|os.O_WRONLY, os.ModeAppend) if err != nil { fmt.Println("open err:" + err.Error()) return } defer f.Close() bs := make([]byte, bufLen) writer := bufio.NewWriter(f) for { var read int switch read, err = body.Read(bs[:]); true { case read < 0: fmt.Println("read err: ", err.Error()) return case read == 0, err == io.EOF: fmt.Printf("downLoad over") return writer.Flush() case read > 0: _, err = writer.Write(bs[:read]) if err != nil { fmt.Println("write err:" + err.Error()) return } } } return } 读取文件流+并发分片写 type FileShard struct { Data []byte Err error Code int // 0-正常 -1=失败 } var bufLen = 2 * 1024 * 1024 func DownLoadFileShardCon(writerFilePath string, body io.Reader) (err error) { writerFile, err := os.OpenFile(writerFilePath, os.O_CREATE|os.O_APPEND|os.O_WRONLY, os.ModeAppend) if err != nil { fmt.Println("open err:" + err.Error()) return } defer writerFile.Close() ch, complete := make(chan *FileShard), make(chan struct{}) go func() { writer := bufio.NewWriter(writerFile) youKnow: for { select { case data := |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |